package jschool.manejadores;

import java.util.ArrayList;

import jschool.entidades.Asistencia;
import jschool.entidades.Colegio;
import jschool.entidades.Curso;
import jschool.entidades.Estudiante;
import jschool.entidades.Horario;
import jschool.entidades.Materia;
import jschool.entidades.Nomina;
import jschool.entidades.Nota;
import jschool.entidades.Pago;
import jschool.entidades.PersonalEscolar;

public class ManejadorDeDatos {
	
	private static ManejadorDeDatos manejadorDeDatos;
	
	private ManejadorDeAsistencia manejadorDeAsistencia;
	private ManejadorDeColegio manejadorDeColegio;
	private ManejadorDeCurso manejadorDeCurso;
	private ManejadorDeEstudiante manejadorDeEstudiante;
	private ManejadorDeHorario manejadorDeHorario;
	private ManejadorDeMateria manejadorDeMateria;
	private ManejadorDeNomina manejadorDeNomina;
	private ManejadorDeNota manejadorDeNota;
	private ManejadorDePago manejadorDePago;
	private ManejadorDePersonalEscolar manejadorDePersonalEscolar;
	private ManejadorDeLogin manejadorDeLogin;
	
//-----------------------------------------------------------------------------
	
	private ManejadorDeDatos() {
		manejadorDeAsistencia = ManejadorDeAsistencia.getInstancia();
		manejadorDeColegio = ManejadorDeColegio.getInstancia();
		manejadorDeCurso = ManejadorDeCurso.getInstancia();
		manejadorDeEstudiante = ManejadorDeEstudiante.getInstancia();
		manejadorDeHorario = ManejadorDeHorario.getInstancia();
		manejadorDeMateria = ManejadorDeMateria.getInstancia();
		manejadorDeNomina = ManejadorDeNomina.getInstancia();
		manejadorDeNota = ManejadorDeNota.getInstancia();
		manejadorDePago = ManejadorDePago.getInstancia();
		manejadorDePersonalEscolar = ManejadorDePersonalEscolar.getInstancia();
		manejadorDeLogin = ManejadorDeLogin.getInstancia();
		
	}
	
//-----------------------------------------------------------------------------
	
	public static ManejadorDeDatos getInstancia() {
		
		if( manejadorDeDatos == null ){
			manejadorDeDatos = new ManejadorDeDatos();
		}
		
		return manejadorDeDatos;
	}
	
//-----------------------------------------------------------------------------
	
	
	
	public boolean loguear( String usuario, String clave ) {
		return manejadorDeLogin.verificarLogin( usuario, clave );
	}
	
	
	/**
	 * No usar con COLEGIO
	 */
	public void agregar( Dato tipo, Object entidad ) {
		switch( tipo ) {
		
		case ASISTENCIA:
			manejadorDeAsistencia.agregarAsistencia( ( Asistencia ) entidad );
			break;
			
		case CURSO:
			manejadorDeCurso.agregarCurso( ( Curso ) entidad );
			break;
			
		case ESTUDIANTE:
			manejadorDeEstudiante.agregarEstudiante( ( Estudiante ) entidad );
			break;
			
		case HORARIO:
			manejadorDeHorario.agregarHorario( ( Horario ) entidad );
			break;
			
		case MATERIA:
			manejadorDeMateria.agregarMateria( ( Materia ) entidad );
			break;
			
		case NOMINA:
			manejadorDeNomina.agregarNomina( ( PersonalEscolar ) entidad );
			break;
			
		case NOTA:
			manejadorDeNota.agregarNota( ( Nota ) entidad );
			break;
			
		case PAGO:
			manejadorDePago.agregarPago( ( Pago ) entidad );
			break;
			
		case PERSONAL_ESCOLAR:
			manejadorDePersonalEscolar.agregarPersonalEscolar( ( PersonalEscolar ) entidad );
			break;
		}
	}
	
	/**
	 * No usar con HORARIO, NOTA, COLEGIO
	 */
	public void eliminar( Dato tipo, int id ) {
		switch( tipo ) {
		
		case ASISTENCIA:
			manejadorDeAsistencia.eliminarAsistencia( id );
			break;
			
		case CURSO:
			manejadorDeCurso.eliminarCurso( id );
			break;
			
		case ESTUDIANTE:
			manejadorDeEstudiante.eliminarEstudiante( id );
			break;
			
		case MATERIA:
			manejadorDeMateria.eliminarMateria( id );
			break;
			
		case NOMINA:
			manejadorDeNomina.eliminarNomina( id );
			break;
			
		case PAGO:
			manejadorDePago.eliminarPago( id );
			break;
			
		case PERSONAL_ESCOLAR:
			manejadorDePersonalEscolar.eliminarPersonalEscolar( id );
			break;
		}
	}
	
	/**
	 * Solo usar con MATERIA o NOTA
	 */
	public void eliminar( Dato tipo, int id, int idMateria  ){
		switch( tipo ) {
		
		case HORARIO:
			manejadorDeHorario.eliminarHorario( id, idMateria );
			break;
			
		case NOTA:
			manejadorDeNota.eliminarNota( id, idMateria );
			break;
		
		}
	}
	
	/**
	 * 
	 *No usar con HORARIO, NOTA o COLEGIO
	 */
	public void modificar( Dato tipo, Object entidad, int id ) {
		switch( tipo ) {
		
		case ASISTENCIA:
			manejadorDeAsistencia.modificarAsistencia( ( Asistencia ) entidad, id );
			break;
			
		case CURSO:
			manejadorDeCurso.modificarCurso( ( Curso ) entidad, id );
			break;
			
		case ESTUDIANTE:
			manejadorDeEstudiante.modificarEstudiante( ( Estudiante ) entidad, id );
			break;
			
		case MATERIA:
			manejadorDeMateria.modificarMateria( ( Materia ) entidad, id );
			break;
			
		case NOMINA:
			manejadorDeNomina.modificarNomina( ( PersonalEscolar ) entidad, id );
			break;
			
		case PAGO:
			manejadorDePago.modificarPago( ( Pago ) entidad, id );
			break;
			
		case PERSONAL_ESCOLAR:
			manejadorDePersonalEscolar.modificarPersonalEscolar( ( PersonalEscolar ) entidad, id );
			break;
		}
	}
	
	/**
	 * 
	 *Solo usar con HORARIO o NOTA
	 */
	public void modificar( Dato tipo, Object entidad, int id, int idMateria ){
		switch( tipo ) {
		
		case HORARIO:
			manejadorDeHorario.modificarHorario( ( Horario ) entidad, id, idMateria );
			break;
			
		case NOTA:
			manejadorDeNota.modificarNota( ( Nota ) entidad, id, idMateria );
			break;
		}
	}
	
	
	/**
	 * 
	 *Solo usar con COLEGIO
	 */
	public void modificar( Dato tipo, Object entidad, String nombre ){
		switch( tipo ) {
		
		case COLEGIO:
			manejadorDeColegio.modificarColegio( ( Colegio ) entidad, nombre );
			break;
		}
	}
	
	
	public ArrayList < ? > obtener( Dato tipo ) {
		switch( tipo ) {
		
		case ASISTENCIA:
			return ( ArrayList < Asistencia > ) manejadorDeAsistencia.getAsistencia();
			
		case COLEGIO:
			return ( ArrayList < Colegio > ) manejadorDeColegio.getColegio();
			
		case CURSO:
			return ( ArrayList < Curso > ) manejadorDeCurso.getCurso();
		
		case ESTUDIANTE:
			return ( ArrayList < Estudiante > ) manejadorDeEstudiante.getEstudiante();
		
		case HORARIO:
			return ( ArrayList < Horario > ) manejadorDeHorario.getHorario();
		
		case MATERIA:
			return ( ArrayList < Materia > ) manejadorDeMateria.getMaterias();
		
		case NOMINA:
			return ( ArrayList < Nomina > ) manejadorDeNomina.getNominas();
		
		case NOTA:
			return ( ArrayList < Nota > ) manejadorDeNota.getNotas();
		
		case PAGO:
			return ( ArrayList < Pago > ) manejadorDePago.getPagos();
		
		case PERSONAL_ESCOLAR:
			return ( ArrayList < PersonalEscolar > ) manejadorDePersonalEscolar.getPersonalEscolar();
		
		default:
			return null;
		}
	}
}
